package JavaEE.ManyThread3;
import java.util.*;
public class Demo3 {
    public static int n;
    // 两次加锁,死锁!!!危险!!
    public static Object locker = new Object();
    public static void main(String[] args) throws InterruptedException{
        Thread thread = new Thread(() -> {

            // **************************************************
            // 连续加锁两次,造成"死锁"
            // 因为 第一次加锁后,紧接着进入第二次加锁
            // 第二次加锁,发现该锁已经被锁上了,所以需要"堵塞状态"等待锁解开
            // 而这个阻塞,完全阻挡了这个锁打开的过程,所以就造成了"死锁"
            // **************************************************
            // 为了解决这个情况,java中引入了"可重入"的性质,解决"一个线程一把锁,加锁多次"
            synchronized (locker){
                synchronized (locker){
                    n++;
                }
            }
            // 这是不会"死锁"的,因为java中有"可重入"
            // 后续再针对这个对象加锁时,就会先判定
            // "当前尝试加锁的线程 是不是已经持有这个锁的线程"
            // 如果不是,才触发阻塞
            // 如果是,直接放行
        });
        thread.start();
        thread.join();
        System.out.println(n);
    }
}


